﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using CobreDireto.net.Exceptions;
using CobreDireto.net.Serialization;
namespace CobreDireto.net
{
    /// <summary>
    /// Agrega todas as operações para o WebService do CobreDireto.
    /// </summary>
    public class Manager
    {
        /// <summary>
        /// Cria Um Pedido
        /// </summary>
        /// <param name="payorder">Objeto dos Pedido</param>
        /// <returns>objeto com o retorno do webservice</returns>
        public static PayOrderReturn PayOrder(PayOrder payorder)
        {
            try
            {
                string data = Serializer<PayOrder>.Serialize(payorder);
                Config.CobreDiretoConfigurationSection configSection = ConfigurationManager.GetSection("cobreDireto") as Config.CobreDiretoConfigurationSection;
                if (configSection != null)
                {
                    PayOrderReturn result = null;
                    CobreDiretoService.BPagWSClient clientWCF = new CobreDiretoService.BPagWSClient();

                    string strReposnse = clientWCF.doService(configSection.Version, Actions.payOrder.ToString(), configSection.Merchant, configSection.User, configSection.Password, data);

                    result = Serializer<PayOrderReturn>.Deserialize(strReposnse);

                    if (result.BPagData==null)
                    {
                        throw new PayOrderCobreDiretoException(string.Format("Status: {0}/ Message: {1}",result.Status,result.Message) , result);
                    }

                    return result;
                }
                else
                {
                    throw new ConfigCobreDiretoException();
                    
                }

            }
            catch (CobreDiretoException ex)
            {
                throw ex;
            }
            catch (Exception ex)
            {

                throw new CobreDiretoException(ex);
            }
        }


        /// <summary>
        /// Consulta o status de um pedido
        /// </summary>
        /// <param name="probe">objeto da sonda com as informcacoes do pedido</param>
        /// <returns>Objeto de retorno da sonda</returns>
        public static ProbeReturn Probe(Probe probe)
        {
            try
            {
                string data = Serializer<Probe>.Serialize(probe);

                Config.CobreDiretoConfigurationSection configSection = ConfigurationManager.GetSection("cobreDireto") as Config.CobreDiretoConfigurationSection;
                if (configSection != null)
                {
                    ProbeReturn result = null;
                    CobreDiretoService.BPagWSClient clientWCF = new CobreDiretoService.BPagWSClient();
                    
                    string strReposnse = clientWCF.doService(configSection.Version, Actions.probe.ToString(), configSection.Merchant, configSection.User, configSection.Password, data);

                    result = Serializer<ProbeReturn>.Deserialize(strReposnse);

                    if (result.Orderdata == null)
                    {
                        throw new ProbeCobreDiretoException(string.Format("Status: {0}/ Message: {1}", result.Status, result.Message), result);
                    }

                    return result;
                }
                else
                {
                    throw new ConfigCobreDiretoException();

                }

            }
            catch (CobreDiretoException ex)
            {
                throw ex;
            }
            catch (Exception ex)
            {

                throw new CobreDiretoException(ex);
            }
        }


    }
}
